home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
QRZ! Ham Radio 8
/
QRZ Ham Radio Callsign Database - Volume 8.iso
/
pc
/
files
/
t_unix
/
bs941029.tgz
/
bbsx-941029.tar
/
bbsx
/
bbs_develop.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-10-29
|
5KB
|
274 lines
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
#include <time.h>
#include <termios.h>
#include <sys/socket.h>
#include "bbs.h"
#ifdef BOXBIN
int get_key()
{
int ch;
static struct termio save, set;
ioctl(0, TCGETA, &save);
set = save;
set.c_lflag &= !ICANON;
set.c_lflag &= !ECHO;
set.c_iflag = 0;
set.c_cc[VMIN] = 1;
set.c_cc[VTIME] = 0;
ioctl(0, TCSETA, &set);
read(0, &ch, 1);
ioctl(0, TCSETA, &save);
signal(SIGINT,interrupt_handler);
signal(SIGQUIT,interrupt_handler);
return ch;
}
#endif
#ifdef BOXBIN
int send_binary(struct mail *mail, char *line)
{
char buffer[1024];
char filename[50];
long now;
char ch;
FILE *pip, *fp;
int fl, old_1;
long bytes;
int i,j, abort_len;
unsigned int crc=0;
unsigned int msg_crc;
static struct termio save, set;
i = sscanf(line,"#BIN#%d#|%d",&bytes,&msg_crc);
if (i != 2) {
if (level != MBOX) {
puts("WARNING: No binary reading");
}
return 1;
}
puts("#OK#");
sprintf(buffer,"%s BBS.%d",UUENCODE,getpid());
sprintf(filename,"%s%d","/tmp/BBS.",getpid());
fl = open(filename,O_CREAT | O_WRONLY, 0600);
/* old_1=dup(1);
dup2(fl, 1);
if ((pip=popen(buffer,"wb")) == NULL) {
halt();
} */
*buffer= 0;
abort_len = strlen("#ABORT#");
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
ioctl(0, TCGETA, &save);
set = save;
set.c_lflag &= ~ICANON;
set.c_lflag &= ~ECHO;
set.c_lflag &= ~ECHONL;
set.c_iflag != IGNBRK;
set.c_iflag != IGNPAR;
set.c_iflag &= ~INLCR;
set.c_cc[VMIN] = 1;
set.c_cc[VTIME] = 0;
set.c_oflag = ~OPOST;
ioctl(0, TCSETA, &set);
for(i=0; i < bytes; i++) {
read(0, &ch, 1);
if (level != MBOX) {
if (strlen(buffer) < abort_len) {
buffer[strlen(buffer)+1] = 0;
buffer[strlen(buffer)] = ch;
} else
{
for(j=0; j < abort_len - 1; j++) {
buffer[j] = buffer[j+1];
}
buffer[j] = ch;
buffer[abort_len] = 0;
}
if (!strcmp(buffer,"#ABORT#")) {
/* pclose(pip);
close(1);
dup2(old_1, 1);
close(old_1); */
#ifdef NICHT_JETZT
unlink(filename);
#endif
ioctl(0, TCSETA, &save);
puts("Binarytransmission aborted");
signal(SIGINT,interrupt_handler);
signal(SIGQUIT,interrupt_handler);
return 2;
}
}
write(fl,&ch,1);
printf("get char 0x%x\n",ch);
crc = do_crc(&ch,1,crc);
}
ioctl(0, TCSETA, &save);
signal(SIGINT,interrupt_handler);
signal(SIGQUIT,interrupt_handler);
/* close(1);
pclose(pip);
dup2(old_1, 1);
close(old_1); */
close(fl);
if (crc != msg_crc) {
#ifdef NICHT_JETZT
unlink(filename);
#endif
if (level != MBOX) {
printf("\n*** checksum error! message not stored.\n\n");
return 2;
}
else exit(0);
}
printf("#OK#%d\n",crc);
sprintf(buffer,"#UUENCODE%s",line);
append_line(mail, buffer);
if ((fp = fopen(filename,"rb")) == NULL) halt();
while(!feof(fp)) {
fread(buffer, 1024, 1, fp);
append_line(mail, buffer);
}
fclose(fp);
unlink(filename);
return 0;
}
#endif
#ifdef BOXBIN
int init_crc()
{
int i,j;
for (i = 0; i < 256; i++) {
crctab[i] = 0;
for (j = 0; j < 8; j++) {
if ((bittab[j] & i) != 0) {
crctab[i] = crctab[i] ^ crcbit[j];
}
}
}
}
#endif
#ifdef BOXBIN
int do_crc(char *buf, int n, unsigned int crc)
{
while (--n >= 0)
crc = (crctab[(crc >> 8)] ^ ((crc << 8) | *buf++)) & 0xffff;
return (crc);
}
#endif
#ifdef BOXBIN
int uudecode(FILE *fp, char *line)
{
int i, buf_size, fl;
FILE *pip;
char filename[50];
char buffer[1024];
char ch;
unsigned int crc=0;
static struct termio save, set;
fgets(buffer, sizeof(buffer), fp);
i = sscanf(buffer,"%*s %*s %s\n",filename);
if ((pip=popen(UUDECODE,"wb")) == NULL) {
halt();
}
sprintf(filename,"/tmp/BBS.%d",getpid());
sprintf(buffer,"begin 600 %s\n",filename);
fputs(buffer, pip);
buf_size = sizeof(buffer);
while(fgets(buffer, buf_size,fp)) {
fputs(buffer, pip);
}
pclose(pip);
if((fl=open(filename, O_RDONLY)) == -1) halt();
puts(line);
gets(buffer);
if(strcmp(buffer,"#OK#")) {
close(fl);
unlink(filename);
return 0;
}
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
ioctl(0, TCGETA, &save);
set = save;
set.c_lflag &= ~ICANON;
set.c_lflag &= ~ECHO;
set.c_lflag &= ~ECHONL;
set.c_lflag &= !ISIG;
set.c_iflag = 0;
set.c_cc[VMIN] = 1;
set.c_cc[VTIME] = 0;
set.c_oflag = 0;
ioctl(0, TCSETA, &set);
while((i=read(fl,&ch,1)) && (i != -1)) {
putchar(ch);
crc = do_crc(&ch,1,crc);
}
signal(SIGINT,interrupt_handler);
signal(SIGQUIT,interrupt_handler);
close(fl);
unlink(filename);
ioctl(0, TCSETA, &save);
printf("\n");
return 0;
}
#endif